﻿#define _CRT_SECURE_NO_WARNINGS 1
//3485. 最大异或和
//给定一个非负整数数列 a，初始长度为 N。
//请在所有长度不超过 M的连续子数组中，找出子数组异或和的最大值。
//子数组的异或和即为子数组中所有元素按位异或得到的结果。
//注意：子数组可以为空。
//输入格式
//第一行包含两个整数 N, M。
//第二行包含 N个整数，其中第 i个为 ai。
//输出格式
//输出可以得到的子数组异或和的最大值。
//数据范围
//对于 20 %的数据，1≤M≤N≤100
//对于 50 %的数据，1≤M≤N≤1000
//对于 100 %的数据，1≤M≤N≤105, 0≤ai≤231−1
//输入样例：
//3 2
//1 2 4
//输出样例：
//6
#include<iostream>
using namespace std;
const int N = 100010 * 31;
int son[N][2], cnt[N], idx;//cnt数组当前存编号为p的节点出现的次数
int s[N];
int n, m;
void insert(int x, int v)//V为1表示添加次数，为-1表示减次数
{
    int p = 0;
    for (int i = 30; i >= 0; i--)
    {
        int u = x >> i & 1;
        if (!son[p][u]) son[p][u] = ++idx;
        p = son[p][u];
        cnt[p] += v;
    }
}
int query(int x)
{
    int p = 0, res = 0;
    for (int i = 30; i >= 0; i--)
    {
        int u = x >> i & 1;
        //由于我们的x可求异或和的范围不是所有s
        //所以不是if (son[p][!u]) 
        if (cnt[son[p][!u]])
        {
            res = res * 2 + 1;
            p = son[p][!u];
        }
        else
        {
            res *= 2;
            p = son[p][u];
        }
    }
    return res;
}
int main()
{
    cin >> n >> m;
    int res = 0;
    for (int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        s[i] = s[i - 1] ^ x;//前缀异或和
    }
    insert(s[0], 1);
    for (int i = 1; i <= n; i++)
    {
        if (i > m) insert(s[i - m - 1], -1);//表示删除不在M范围内得前缀异或和
        res = max(res, query(s[i]));
        insert(s[i], 1);
    }
    cout << res << endl;
    return 0;
}